#include <bits/stdc++.h>
using namespace std;
int n, m, l;
int a[101][6][6];//记录俄罗斯方块
int f[500][500];//记录颜色
int dx[4] = {0, 1, 0, -1};//方向
int dy[4] = {-1, 0, 1, 0};
bool vis[500][500];//bfs中和main中遍历整个图
struct h{
	int r, t;//每个俄罗斯方块的第一个方块，各为x和y
}k[101];
bool check(int color)
{
	for(int o = 1; o <= l; o++)
	{
		for(int x = 1; x <= 5; x++)
		{
			for(int y = 1; y <= 5; y++)
			{
				if(a[o][x][y] != a[color][x][y])
					return 0;
			}
		}
	}
	return 1;
}
void bfs(int x, int y, int s)
{
	vis[x][y] = 1;
	for(int i = 0; i < 4; i++)
	{
		int tx = dx[i] + x, ty = dy[i] + y;
		if(f[tx][ty] == s && !vis[tx][ty])
		{
			int xx = tx - k[s].r;
			int yy = ty - k[s].t;
			a[s][xx][yy] = 1;
			bfs(tx, ty, s);
		}
	}
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++) {
			cin >> f[i][j];
			if(f[i][j] > l)
				l++;//记录俄罗斯方块数
		}
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			if(vis[i][j] == 0){//找遍历过的
				k[f[i][j]].r = i - 1, k[f[i][j]].t = j - 1;
				bfs(i, j, f[i][j]);
			}
	int ans = l;
	for(int i = 1; i <= l; i++)
	{
		if(check(i))
			ans--;
	}
	cout << ans << endl;
	return 0;
}